package com.bright.cwduijie.duijie.manager;

import com.bright.cwduijie.duijie.pojo.command.BuildCommand;
import com.bright.cwduijie.duijie.pojo.command.MonthlySettledCommand;
import com.bright.cwduijie.duijie.pojo.dto.*;
import com.bright.cwduijie.duijie.pojo.po.*;
import com.bright.cwduijie.duijie.pojo.query.DuijieQuery;
import org.springframework.lang.Nullable;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Author hxj
 * @Date 2024/7/4 16:12
 * @Description
 */

public interface DataManager {

    /**
     * 获取需要对接的账套
     * @return
     */
//    List<AccSetDto> getNeedDuijieAccSets();

    /**
     * 获取需要对接的账套科目数据 key=账套对象  value=科目列表
     * @return
     */
//    Map<AccSetDto, List<AccCodeDto>> getNeedDuijieAccCodeMap();

    /**
     * 获取需要对接的固定资产折旧记录
     * @return
     */
//    List<FixedAssetsDepreciationLogDto> getNeedDuijieFixedAssetsDepreciationLogs();
//
//    List<FixedAssetsHandleLogDto> getNeedDuijieFixedAssetsHandleLogs();
//
//    List<FixedAssetsInfoChangeDto> getNeedDuijieFixedAssetsInfoChanges();
//
//    List<FixedAssetsValueChangeDto> getNeedDuijieFixedAssetsValueChange();

//    List<FixedAssetsDepreciationLog> getNeedDuijieFixedAssetsDepreciationLogs(DuijieQuery duijieQuery);
//
//    List<FixedAssetsHandleLog> getNeedDuijieFixedAssetsHandleLogs(DuijieQuery duijieQuery);
//
//    List<FixedAssetsInfoChange> getNeedDuijieFixedAssetsInfoChanges(DuijieQuery duijieQuery);
//
//    List<FixedAssetsValueChange> getNeedDuijieFixedAssetsValueChange(DuijieQuery duijieQuery);

    /**
     * 获取所有接口需要对接的账套zt_data_key
     * @return
     */
//    List<ApiNeedDuijieDto> getNeedDuijieAccSetsOfAllApi();

//    /**
//     * 保存账套对接后的结果
//     * @param accSetDtos
//     */
//    void saveAccSetResult(List<AccSetDto> accSetDtos);

    Set<String> getZtDataKeyByCreditCodes(Set<String> tyshxydmSet);

    @Nullable
    AccSetDto getAccSet(DuijieQuery duijieQuery);

    /**
     * 获取所有账套 根据统一社会信用代码 支持获取一个或获取多个
     * @return
     */
    List<AccSet> getAllAccSetsByTYSHXYDM(DuijieQuery duijieQuery);

    @Nullable
    AccSet getAccSetPO(DuijieQuery duijieQuery);

    List<AccSet> getAccSetsByDataKeys(DuijieQuery duijieQuery);

    List<AccCodeDto> getAccCodes(DuijieQuery duijieQuery);

//    Map<String, List<BalanceDto>> getBalances(DuijieQuery duijieQuery);
//
//    Map<String, List<CreditPublishDto>> getCreditPublishes(DuijieQuery duijieQuery);
//
//    Map<String, List<DebtPublishDto>> getDebtPublishes(DuijieQuery duijieQuery);
//
//    List<MonthlySettlementDto> getMonthlySettlement(DuijieQuery duijieQuery);
//
//    List<MonthlySettlementDto> getMonthlySettlementByYearMonth(DuijieQuery duijieQuery, String yearMonth);

    List<VoucherDto> getVouchers(DuijieQuery duijieQuery);

    List<VoucherEntryDto> getVoucherEntries(DuijieQuery duijieQuery);

    /**
     * 单次获取这个账套下全部数据 按data_key分好组
     * @param duijieQuery
     * @return
     */
//    Map<String, List<VoucherEntryDto>> getVoucherEntriesByZtDataKey(DuijieQuery duijieQuery);
//
//    List<FixedAssets> getFixedAssets(DuijieQuery duijieQuery);
//
//    List<DayBooks> getDayBooks(DuijieQuery duijieQuery);
//
//
//    List<Contract> getContracts(DuijieQuery duijieQuery);

    /**
     * 调用DJ_ZTYJ存储过程生成月结数据
     * @param command
     */
    void executeMonthlySettled(MonthlySettledCommand command);

    /**
     * 获取财务库名称+前缀
     * @return 返回值包括点点 如by_bjaccount.. 如果没有配cwdb则返回空字符串
     */
    String getCwDBName();

    String getZcDBName();

    /**
     * 通过地区号获取地区名称 从资产库地区表
     * @return
     */
    String getDistNameByDistNo(String distNo);

    /**
     * 调用DZ_SPT
     */
    void executeSPT(Object accSet, BuildCommand buildCommand);

    /**
     * 转换账套号和ztDataKey
     * @param accSet
     * @return
     */
    List<String> getZtDataKeyByAccSets(List<Object> accSet);

    /**
     * 获取需要删除的附件
     * @param duijieQuery
     * @return
     */
    List<DjFile> getNeedDuiJieFiles(DuijieQuery duijieQuery);

    List<Map<String, Object>> getDistsByDistNoAndLevel(String distNo, Integer level);

    String getTopDistNo();
}
